#ifndef MODBUSSERVICE_H
#define MODBUSSERVICE_H

#include <QObject>
#include <QModbusTcpClient>
#include <QModbusDataUnit>
#include <QModbusReply>
#include <QString>
#include <QVector>
#include "entities/Device.h"

/**
 * @brief Modbus TCP 通信服务类
 * @details 提供 Modbus TCP 连接和寄存器读写功能：
 *          - TCP 连接管理（连接/断开）
 *          - 读取输入寄存器（功能码 0x04）
 *          - 连接状态监控
 *          - 错误处理和重连机制
 */
class ModbusService : public QObject
{
    Q_OBJECT

public:
    // 连接状态枚举
    enum ConnectionState
    {
        Disconnected, // 未连接
        Connecting,   // 连接中
        Connected,    // 已连接
        Error         // 错误状态
    };
    Q_ENUM(ConnectionState)

    explicit ModbusService(QObject *parent = nullptr);
    ~ModbusService();

    // 连接到 Modbus 设备
    bool connectToDevice(const Device &device);
    bool connectToDevice(const QString &ipAddress, int port, int slaveId);

    // 断开连接
    void disconnectFromDevice();

    // 读取输入寄存器（功能码 0x04）
    bool readInputRegisters(int startAddress, int count);

    // 获取连接状态
    ConnectionState connectionState() const { return m_connectionState; }
    bool isConnected() const { return m_connectionState == Connected; }

    // 获取当前设备信息
    QString currentDeviceId() const { return m_currentDeviceId; }
    QString currentIpAddress() const { return m_currentIpAddress; }
    int currentPort() const { return m_currentPort; }
    int currentSlaveId() const { return m_currentSlaveId; }

    // 获取最后一次错误信息
    QString lastError() const { return m_lastError; }

signals:
    // 连接状态变化信号
    void connectionStateChanged(ConnectionState state);

    // 连接成功信号
    void connected();

    // 断开连接信号
    void disconnected();

    // 连接错误信号
    void connectionError(const QString &error);

    // 读取寄存器成功信号
    void registersRead(int startAddress, const QVector<quint16> &values);

    // 读取寄存器失败信号
    void readError(const QString &error);

private slots:
    // 处理连接状态变化
    void onStateChanged(QModbusDevice::State state);

    // 处理错误
    void onErrorOccurred(QModbusDevice::Error error);

    // 处理读取完成
    void onReadReady();

private:
    // 设置连接状态
    void setConnectionState(ConnectionState state);

    // 设置错误信息
    void setError(const QString &error);

private:
    QModbusTcpClient *m_modbusClient;  // Modbus TCP 客户端
    ConnectionState m_connectionState; // 连接状态
    QString m_lastError;               // 最后一次错误信息

    // 当前连接的设备信息
    QString m_currentDeviceId;
    QString m_currentIpAddress;
    int m_currentPort;
    int m_currentSlaveId;
};

#endif // MODBUSSERVICE_H
